package com.fsh.subject.application.intercepter;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Objects;

/**
 * 作者：fsh
 * 日期：2023/12/06
 * <p>
 * 描述：feign 请求拦截器
 *
 * 定义了一个公共的Java类FeignRequestInterceptor，实现了RequestInterceptor接口。
 */
public class FeignRequestInterceptor implements RequestInterceptor {

    /**
     * 实现了RequestInterceptor接口的apply方法，
     * 该方法在执行Feign请求之前会被调用，用于对请求进行拦截和处理。
     */
    @Override
    public void apply(RequestTemplate requestTemplate) {
        //获取当前请求的ServletRequestAttributes对象，该对象包含了请求相关的信息。
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        //从ServletRequestAttributes对象中获取HttpServletRequest对象，该对象包含了HTTP请求的详细信息。
        HttpServletRequest request = requestAttributes.getRequest();
        //判断request对象是否为空。
        if(Objects.nonNull(request)){
            //取出loginId（实际上这一步在 subject的拦截器中已经取出来了，就放在threadLocal中）
            String loginId = request.getHeader("loginId");
            if(StringUtils.isNotBlank(loginId)){
                //将"loginId"作为请求头的名称，将loginId的值作为请求头的值，添加到Feign请求的RequestTemplate中。
                requestTemplate.header("loginId",loginId);
            }
        }

        //-----------这两种 二选一

        //直接从subject服务的 threadLocal中获取loginId
/*        String loginId = LoginUtil.getLoginId("loginId");
        if (StringUtils.isNotBlank(loginId)){
            requestTemplate.header("loginId",loginId);
        }*/
    }
}
